/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.ivanbiz.impl;

import com.ivanbiz.dao.TukarBarangDAO;
import com.ivanbiz.model.Barang;
import com.ivanbiz.model.HibernateUtil;
import com.ivanbiz.model.Hutang;
import com.ivanbiz.model.ItemNota;
import com.ivanbiz.model.Nota;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;

/**
 *
 * @author User
 */
public class TukarBarangDAOImpl extends GenericDAOImpl implements TukarBarangDAO {

    public void tukarBarang(Nota nota, List<Barang> listBarang, List<Barang> listNewBarang) throws Exception {
        try {
            HibernateUtil.beginTransaction();
            Session session = HibernateUtil.getSession();
            session.update(nota);
            double harga = 0;
            double total = 0;
            for (Barang barang : listBarang) {
                Barang barangDb = (Barang) session.load(Barang.class, barang.getId());
                barangDb.setStock(barangDb.getStock() + barang.getStock());
                session.update(barangDb);
                if (nota.getStatusPembayaran().equals("Kredit")) {
                    for (int x = 0; x < nota.getItemNota().size(); x++) {
                        ItemNota itemNota = (ItemNota) nota.getItemNota().get(x);
                        if (itemNota.getBarang().getKode().equals(barang.getKode())) {
                            harga += itemNota.getHargaJual() * barang.getStock();
                        }
                    }
                }

            }
            
            if (nota.getStatusPembayaran().equals("Kredit")) {
                Criteria crit = session.createCriteria(Hutang.class);
                crit.add(Restrictions.eq("nota", nota));
                Hutang hutang = (Hutang) crit.uniqueResult();
                hutang.setSisaHutang(hutang.getSisaHutang() - harga);
                session.update(hutang);
            }
           
            for (Barang barang : listNewBarang) {
                Barang barangDb = (Barang) session.load(Barang.class, barang.getId());
                barangDb.setStock(barangDb.getStock() - barang.getStock());
                session.update(barangDb);
                if (nota.getStatusPembayaran().equals("Kredit")) {
                    for (int x = 0; x < nota.getItemNota().size(); x++) {
                        ItemNota itemNota = (ItemNota) nota.getItemNota().get(x);
                        if (itemNota.getBarang().getKode().equals(barang.getKode())) {
                            total += itemNota.getHargaJual() * barang.getStock();
                        }
                    }
                }
            }
            if (nota.getStatusPembayaran().equals("Kredit")) {
                Criteria crit = session.createCriteria(Hutang.class);
                crit.add(Restrictions.eq("nota", nota));
                Hutang hutang = (Hutang) crit.uniqueResult();
                hutang.setSisaHutang(hutang.getSisaHutang() + total);
                session.update(hutang);
            }

            HibernateUtil.commitTransaction();
        } catch (Exception e) {
            HibernateUtil.rollbackTransaction();
            throw e;
        } finally {
            HibernateUtil.closeSession();

        }
    }
}
